package game.model;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * 棋盘，有一定的大小，持有一个Block列表
 *
 * @author 陈渤林
 */
public class Board {

    /**
     * 将指定棋盘逆时针旋转 90 度，并返回
     *
     * @param board 指定棋盘
     * @return 旋转后的棋盘
     */
    static public Board rotateBoard90Degree(Board board) {
        Queue<Block> qe = new LinkedList<>();
        for (int y = 0; y < board.getHeight(); ++y) {
            for (int x = 0; x < board.getWidth(); ++x) {
                qe.add(board.getBlock(x, y));
            }
        }
        Board newBoard = new Board(board.getHeight(), board.getWidth());
        for (int x = newBoard.getWidth() - 1; x >= 0; --x) {
            for (int y = 0; y < newBoard.getHeight(); ++y) {
                newBoard.setBlock(x, y, qe.poll());
            }
        }
        return newBoard;
    }

    /**
     * 棋盘宽
     */
    private int width;

    public int getWidth() {
        return width;
    }

    /**
     * 棋盘高
     */
    private int height;

    public int getHeight() {
        return height;
    }

    /**
     * 方块列表
     */
    private List<List<Block>> blocks;
//	Block[][] blocks_;


    /**
     * 返回指定位置的方块，如果不存在则返回 null
     *
     * @param x 横坐标
     * @param y 纵坐标
     * @return 指定位置的方块
     */
    public Block getBlock(int x, int y) {
        return blocks.get(x).get(y);
    }

    /**
     * 设置某个位置的方块，返回这个位置之前的方块
     *
     * @param x     横坐标
     * @param y     纵坐标
     * @param block 新放入的方块
     * @return 指定位置之前的方块
     */
    public Block setBlock(int x, int y, Block block) {
        Block ret = getBlock(x, y);
//		blocks_[x][y] = block;
        blocks.get(x).set(y, block);
        return ret;
    }

    /**
     * 构造函数需要传入棋盘大小
     *
     * @param width  棋盘宽
     * @param height 棋盘高
     */
    public Board(int width, int height) {
        this.width = width;
        this.height = height;
        blocks = new ArrayList<List<Block>>();
        for (int i = 0; i < this.width; ++i) {
            blocks.add(new ArrayList<Block>());
            for (int j = 0; j < this.height; ++j)
                blocks.get(i).add(null);
        }
    }

    /**
     * 将指定的棋盘内容浅拷贝到 this 上
     *
     * @param board 指定的棋盘内容
     * @return 返回是否成功
     */
    public void copiedBy(Board board) {
        this.width = board.width;
        this.height = board.height;
        for (int x = 0; x < this.getWidth(); ++x) {
            for (int y = 0; y < this.getHeight(); ++y) {
                this.setBlock(x, y, board.getBlock(x, y));
            }
        }
    }

}
